const config = require('../../config');
const MongoClient = require('mongodb').MongoClient;
const ObjectID = require('mongodb').ObjectID;

/**
 * 数据库操作构造函数
 * @author jasonZhang
 * @constructor
 */
class users {
  /**
   * 数据库操作-id查询（现兼任校验token功能 - 后期专门开发）
   * @author jasonZhang
   * @param {String} tabName 查询表名称
   * @param {String} objId 查询对象的_id
   * @return 基于findOne方法返回一个对象
   */
  async findOneByObjId(tabName, objId) {
    return new Promise(function(resolve, reject) {
      MongoClient.connect(config.mongodb_url, function(err, db) {
        var maindb = db.db(config.cms_dbname);
        maindb.collection(tabName, function(err, col) {
          if(!err) {
            col.findOne({
              _id: ObjectID(objId)
            }, function(err, docs) {
              if(!err) {
                resolve(docs)
              } else {
                reject(err)
              }
            })
          } else {
            reject(err)
            throw err
          }

        })
      })
    })
  }

  /**
   * 数据库操作-查询 查询返回单条一个对象
   * @author jasonZhang
   * @param {String} tabName 查询表名称
   * @param {Object} findBy 组装完成的查询条件
   * @return 基于find方法返回一个数组
   */
  async findOne(tabName, findBy) {
    return new Promise(function(resolve, reject) {
      MongoClient.connect(config.mongodb_url, function(err, db) {
        var maindb = db.db(config.cms_dbname);
        maindb.collection(tabName, function(err, col) {
          if(!err) {
            col.findOne(findBy, function(err, docs) {
              if(!err) {
                resolve(docs)
              } else {
                reject(err)
              }
            })
          } else {
            reject(err)
            throw err
          }

        })
      })
    })
  }

  /**
   * 数据库操作-查询（基于Promise对象）
   * @author jasonZhang
   * @param {String} tabName 查询表名称
   * @param {Object} findBy 组装完成的查询条件
   * @return 基于find方法返回一个数组
   */
  async find(tabName, findBy) {
    return new Promise(function(resolve, reject) {
      MongoClient.connect(config.mongodb_url, function(err, db) {
        var maindb = db.db(config.cms_dbname);
        maindb.collection(tabName, function(err, col) {
          if(!err) {
            col.find(findBy).toArray(async(err, docs) => {
              if(!err) {
                resolve(docs)
              } else {
                reject(err)
              }
            })
          } else {
            reject(err)
            throw err
          }

        })
      })
    })
  }
  /**
   * 数据库操作-插入（基于Promise对象）
   * @author jasonZhang
   * @param {String} tabName 查询表名称
   * @param {Object} insertDate 组装完成的插入语法
   */
  async insert(tabName, insertDate) {
    return new Promise(function(resolve, reject) {
      MongoClient.connect(config.mongodb_url, function(err, db) {
        var maindb = db.db(config.cms_dbname);
        maindb.collection(tabName, function(err, col) {
          if(!err) {
            col.insert(insertDate, function(err, docs) {
              if(!err) {
                resolve(docs)
              } else {
                reject(err)
              }
            })
          } else {
            reject(err)
            throw err
          }
        })
      })
    })
  }

  /**
   * 数据库操作-修改更新（基于Promise对象）
   * @author jasonZhang
   * @param {String} tabName 查询表名称
   * @param {Object|String} condition 查询数据条件
   * @param {Object} replace 组装完成的替换数据
   */
  async update(tabName, condition, replace) {
    return new Promise(function(resolve, reject) {
      MongoClient.connect(config.mongodb_url, function(err, db) {
        var maindb = db.db(config.cms_dbname);
        maindb.collection(tabName, function(err, col) {
          if(!err) {
            if (typeof(condition)=="string") {
            	condition = {
                _id: ObjectID(condition)
              }
            }
            col.update(condition, replace, function(err, docs) {
              if(!err) {
                resolve(docs)
              } else {
                reject(err)
              }
            })
          } else {
            reject(err)
            throw err
          }
        })
      })
    })
  }


  /**
   * 数据库操作-删除（基于Promise对象）
   * @author jasonZhang
   * @param {String} tabName 查询表名称
   * @param {Object|String} condition 查询数据条件
   * @param {Object} replace 组装完成的替换数据
   */
  async remove(tabName, condition) {
    return new Promise(function(resolve, reject) {
      MongoClient.connect(config.mongodb_url, function(err, db) {
        var maindb = db.db(config.cms_dbname);
        maindb.collection(tabName, function(err, col) {
          if(!err) {
            col.remove(condition,function(err, docs) {
              if(!err) {
                resolve(docs)
              } else {
                reject(err)
              }
            })
          } else {
            reject(err)
            throw err
          }
        })
      })
    })
  }

}

module.exports = new users();